home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / c / keymap.exe / KEYMAP.C < prev    next >
Text File  |  1993-03-28  |  4KB  |  221 lines

  1. #include <stdio.h>
  2. #include <conio.h>
  3.  
  4.  
  5. #define KEY_TABLE_SIZE    382
  6.  
  7. typedef struct KEYS
  8.   {
  9.   char name[32];
  10.   struct KEYS *next;
  11.   } KEY_NAME;
  12.  
  13.  KEY_NAME *KeyTable[KEY_TABLE_SIZE];
  14.  
  15.  char InFile[128];
  16.  char OutFile[128];
  17.  
  18.  int EditSelectedKey( unsigned int k );
  19.  void DisplayNames( unsigned int k, FILE *optr );
  20.  void WriteKeyList( void );
  21.  void ReadKeyList( const char * infile );
  22.  
  23.  
  24. main(int argc, char *argv[])
  25. {
  26.  int j;
  27.  unsigned int c;
  28.  int rc;
  29.  
  30.  
  31.     if ( argc != 3 )
  32.       {
  33.       printf("\n\nUsage: keymap <infile> <outfile>\n\n");
  34.       return 1;
  35.       }
  36.  
  37.     strcpy(InFile,argv[1]);
  38.     strcpy(OutFile,argv[2]);
  39.  
  40.     for (j=0; j<KEY_TABLE_SIZE; j++)
  41.       KeyTable[j] = NULL;
  42.  
  43.     ReadKeyList( InFile );
  44.  
  45.     clrscr();
  46.  
  47.     for ( ;; )
  48.       {
  49.       puts("\n\nPress a key: ");
  50.  
  51.       c = getch();
  52.  
  53.       if ( c == 0x1b )
  54.     {
  55.  
  56.     WriteKeyList();
  57.     printf("!!!! DONE !!!!\n\n");
  58.     return 0;
  59.     }
  60.  
  61.       puts("\n");
  62.  
  63.       if ( ! c )
  64.     c = ( 126 + getch() );
  65.  
  66.       if ( rc = EditSelectedKey( c ) )
  67.     return rc;
  68.     }
  69. }
  70.  
  71. int EditSelectedKey( unsigned int k )
  72. {
  73.  KEY_NAME *Temp;
  74.  KEY_NAME *CurKeyName;
  75.  char Name[32];
  76.  
  77.  
  78.     printf("\n\n[0x%0X] (%d decimal)\n",k,k);
  79.  
  80.     DisplayNames( k, stdout );
  81.  
  82.     CurKeyName = KeyTable[k];
  83.  
  84.     if ( CurKeyName != NULL )
  85.       while ( CurKeyName->next != NULL )
  86.     CurKeyName = CurKeyName->next;
  87.  
  88.     for (;;)
  89.       {
  90.       fputs("#define ",stdout);
  91.       gets( Name );
  92.  
  93.       if ( ! strlen(Name) )
  94.     return 0;
  95.  
  96.       Temp = (KEY_NAME *) calloc( 1, sizeof(KEY_NAME) );
  97.  
  98.       if ( Temp == NULL )
  99.     {
  100.     printf("OUT OF MEMORY!!\n\n");
  101.     exit();
  102.     }
  103.  
  104.       strcpy(Temp->name,Name);
  105.       Temp->next = NULL;
  106.  
  107.       if (KeyTable[k] == NULL)
  108.     KeyTable[k] = Temp;
  109.  
  110.       if ( CurKeyName == NULL )
  111.     CurKeyName = Temp;
  112.       else
  113.     {
  114.     CurKeyName->next = Temp;
  115.     CurKeyName = CurKeyName->next;
  116.     }
  117.       }
  118.  
  119.     return 0;
  120. }
  121.  
  122. void DisplayNames( unsigned int k, FILE *optr )
  123. {
  124.  KEY_NAME *Temp;
  125.  
  126.     Temp = KeyTable[k];
  127.  
  128.     while ( Temp != NULL )
  129.       {
  130.       fprintf(optr,"#define %-31s 0x%0X\n",Temp->name,k);
  131.       Temp = Temp->next;
  132.       }
  133.  
  134.     fputc('\n',optr);
  135. }
  136.  
  137. void WriteKeyList( void )
  138. {
  139.  int j;
  140.  KEY_NAME *Temp;
  141.  FILE *optr;
  142.  
  143.     if ( (optr=fopen(OutFile,"w")) == NULL )
  144.       {
  145.       printf("Couldn't open output file '%s'!!!\n\n",OutFile);
  146.       return;
  147.       }
  148.  
  149.  
  150.     printf("\n\nWriting KeyMap to Disk.....");
  151.  
  152.     for (j=0; j < KEY_TABLE_SIZE; j++)
  153.       {
  154.       if (KeyTable[j] != NULL)
  155.     {
  156.     DisplayNames(j,optr);
  157.     }
  158.       }
  159.  
  160.     printf("Done!!\n\n");
  161.  
  162.     fclose(optr);
  163. }
  164.  
  165.  
  166. void ReadKeyList( const char * infile )
  167. {
  168.  FILE *iptr;
  169.  KEY_NAME *Temp;
  170.  KEY_NAME *CurKeyName;
  171.  int k;
  172.  char Control[8];
  173.  char Name[32];
  174.  char CodeString[256];
  175.  unsigned int Code;
  176.  
  177.  if ( (iptr=fopen(infile,"r")) == NULL )
  178.    {
  179.    printf("Could not open Input File\n\n");
  180.    exit(2);
  181.    }
  182.  
  183.  while ( ! feof(iptr) )
  184.    {
  185.    fscanf(iptr,"%7s %31s %x\n",Control,Name,&Code);
  186.  
  187.    if (! strcmp("#define",Control) )
  188.      {
  189.     CurKeyName = KeyTable[Code];
  190.  
  191.     if ( CurKeyName != NULL )
  192.       while ( CurKeyName->next != NULL )
  193.     CurKeyName = CurKeyName->next;
  194.  
  195.     Temp = (KEY_NAME *) calloc( 1, sizeof(KEY_NAME) );
  196.  
  197.     if ( Temp == NULL )
  198.       {
  199.       printf("OUT OF MEMORY!!\n\n");
  200.       exit();
  201.       }
  202.  
  203.  
  204.      strcpy(Temp->name,Name);
  205.  
  206.      Temp->next = NULL;
  207.  
  208.      if (KeyTable[Code] == NULL)
  209.        KeyTable[Code] = Temp;
  210.  
  211.      if ( CurKeyName == NULL )
  212.        CurKeyName = Temp;
  213.      else
  214.        {
  215.        CurKeyName->next = Temp;
  216.        CurKeyName = CurKeyName->next;
  217.        }
  218.     } /**end if valid**/
  219.    }
  220.  fclose(iptr);
  221. }